#include "getmotion.h"
#include "jpg.h"
#include "dirlinklist.h"

//该c文件为程序的主函数，调用其它功能函数达到项目效果。


//初始化LCD显示屏
char *init_lcd(struct fb_var_screeninfo *vinfo)
{
	int lcd = open("/dev/fb0", O_RDWR);

	ioctl(lcd, FBIOGET_VSCREENINFO, vinfo);
	int bpp = vinfo->bits_per_pixel;
	int screensize = vinfo->xres * vinfo->yres * bpp/8;

	char *fbmem = mmap(NULL, screensize, PROT_READ|PROT_WRITE,
			   MAP_SHARED, lcd, 0);
	if(fbmem == MAP_FAILED)
	{
		perror("映射显存失败");
		exit(0);
	}
	return fbmem;
}



// 判断参数的合法性
void usage(int argc, char **argv)
{
	if(argc != 2)
    {
		printf("参数不对,用法：./showphoto <image-dir> \n");
		exit(0);
	}
}

//自动播放图片
void autoshow(linklist head)
{
	
	//准备lcd设备 
	struct fb_var_screeninfo vinfo;
	bzero(&vinfo, sizeof(vinfo));
	char *fbmem = init_lcd(&vinfo);
	
	linklist  tmp = head->next;
	
	while(tmp != head)
	{
	  //每隔一秒显示下一张
	  display(tmp->image_name, fbmem, &vinfo, 0, 0);
	  sleep(1);
	  tmp = tmp->next;
	}
	printf("图片播放完毕\n");
	//结束后 显示回 主页
	display(tmp->next->image_name, fbmem, &vinfo, 0, 0);
}



int main(int argc, char **argv)
{
	
     // 判断参数的合法性（必须要有一个目录用来指定要显示的图片）
	usage(argc, argv);
	
	
	// 准备好 LCD 设备
	struct fb_var_screeninfo vinfo;
	bzero(&vinfo, sizeof(vinfo));
	char *fbmem = init_lcd(&vinfo);

	//初始化链表
	linklist head = init_list();
	
	//遍历目录内图片信息并插入链表中
	head = open_dir(argv[1],head);
	
	//操作图片节点的指针
	linklist tmp = head;
	        //jpg文件名   lcd文件描述符   lcd信息  偏移量  
	display(tmp->next->image_name, fbmem, &vinfo, 0, 0);
	
	while(1)
	{
       //获取屏幕手势操作
 	   enum motion m = get_motion();

	   switch(m)
	   {
		 //左划显示下一张图片
		 case left : 
		        tmp = tmp->prev;
				if(tmp == head)
				{
					tmp = head->prev;
				}
		        printf("显示下一张图片\n");
				display(tmp->image_name, fbmem, &vinfo, 0, 0);
		        break;
				
		 //右划显示上一张图片
		 case right : 
				tmp = tmp->next;
				if(tmp == head)
				{
					tmp = head->next;
				}
		        printf("显示上一张图片\n");
				display(tmp->image_name, fbmem, &vinfo, 0, 0);
		        break;

		//上滑自动播放
		case up:
		       printf("自动播放图片\n");
		       autoshow(head);
		       break;
	    //下滑退出
		case down:
				// 清屏
	           bzero(fbmem, 800 * 480 * 4);
		       printf("退出系统\n");
			   exit(1);
	    default: 
		       continue;
		
				
	   }
	 }
	 return 0;
}